package cn.tedu.IocTest.ioc;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MiniApplicationContext {
    //用来存放Bean的容器
    private Map<String,Object> beans = new HashMap<>();

    /**
     * 在IOC容器的初始化方法 解析bean.xml文件
     * 拿到beans标签中的bean标签中的 id和className
     * id用来标识某个bean对象
     * className用来通过反射创建实例对象
     */
    public MiniApplicationContext(String configPath) {
        try {
            // 解析 XML
            SAXReader reader = new SAXReader();
            Document document = reader.read(new File(configPath));
            Element root = document.getRootElement();

            // 遍历 <bean> 标签
            List<Element> beanList = root.elements("bean");
            for (Element bean : beanList) {
                String id = bean.attributeValue("id");
                String className = bean.attributeValue("className");

                // 反射实例化对象
                Class<?> cls = Class.forName(className);
                Object obj = cls.getDeclaredConstructor().newInstance();

                // 存入容器
                beans.put(id, obj);
            }

        } catch (Exception e) {
            throw new RuntimeException("初始化 IoC 容器失败", e);
        }
    }

    //提供一个全局访问点来获取Ioc中的bean对象
    public Object getBean(String path){
        return beans.get(path);
    }
}
